# -*- coding: utf-8 -*-

 ###############################################
 ##                                             ##
 ##   Submódulo modelo                           ##
 ##   @ Módulo personas                          ##
 ##                                              ##
 ##   de la línea Básicos                        ##
 ##   de Críptidos Digitales                     ##
 ##   GPL (c)2008                                ##
  ##                                             ##
    ###############################################

# print (0), "  personas.modelo       begin"

import datetime

# from man import Atributo, Contacto, Direccion, Entidad, Rol, AtributoRol

import man

from man import *

# tipo = u""

# print (0), "  personas.modelo         definitions"


def rolDefault(tipo):
    rolDefault_id = int(atributoI(grupo=tipo, nombre=u'default').valor)
    registro = rolI(id=rolDefault_id)
    return registro


def damePersonalidad(**filtros):
    f=g
    #! obsoleto, use personalidadI()
    filtros['grupo'] = u'entidades'
    filtros['nombre'] = u'personalidad'
    registro = atributoI(**filtros)
    # registro = man.session().query(Atributo).filter_by(**filtros).one()
    return registro


def personalidad(**filtros):
    registro = atributoI(grupo=u'personalidadEntidad', **filtros)
    return registro


def damePuestos(**filtros):
    registros = atributosI(grupo=u"tipoEmpleado")
    return registros


def rangoPrecioDefault():
    registro = atributoI(grupo=u'rangoPrecioProducto', valor=u'default')
    return registro


def rangosPrecio(**filtros):
    if 'activo' in filtros.keys():
        activo = filtros.pop('activo')
        if activo:
            registros = man.session().query(Atributo).filter(Atributo.grupo==u'rangoPrecioProducto').filter(Atributo.referencia.like(u'%%a%%')).order_by(Atributo.referencia).all()
        else:
            registros = man.session().query(Atributo).filter(Atributo.grupo==u'rangoPrecioProducto').filter(Atributo.referencia.like(u'%%i%%')).order_by(Atributo.referencia).all()
    else:
        registros = man.session().query(Atributo).filter(Atributo.grupo==u'rangoPrecioProducto').order_by(Atributo.referencia).all()
    return registros


def dameUno(*args, **filtros):
    f=g
    #! obsoleto, use rolI()
    if filtros.has_key('id'):
        rol = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    elif 'rfc' in filtros.keys():
        rol = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.rfc==unicode(filtros['rfc'])).first()
    else:
        rol = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter_by(**filtros).first()
    return rol


def dameVarios(*args, **filtros):   # print "personas.modelo.dameVarios()"
    f=g
    #! obsoleto, use rolesI()

    if 'rfc' in filtros.keys():
        roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.rfc==filtros['rfc']).all()
    elif filtros.has_key('nombre2'):
        roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre2==filtros['nombre2']).all()
    elif filtros.has_key('order'):
        if filtros['order'] == 'nombre':
            roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre!=u'').order_by(Entidad.nombre).order_by(Entidad.nombre2).all()
        if filtros['order'] == 'nombre2':
            roles = man.session().query(Rol).join(Entidad).filter(Rol.tipo==args[0]).filter(Entidad.nombre2!=u'').order_by(Entidad.nombre2).order_by(Entidad.nombre).all()
    else:
        roles = man.session().query(Rol).filter(Rol.tipo==args[0]).all()
    return roles


def elimina(**filtros):
    registro = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    man.session().delete(registro)
    man.session().commit()


def modifica(datos):                # print "personas.modelo.modifica()"
    f=g
    #! obsoleto, use rolI()

    rol = man.session().query(Rol).filter(Rol.id==datos['id']).one()
    if 'comentarios' in datos.keys():
        rol.comentarios = datos['comentarios']
    rol.entidad.nombre = datos['nombre']
    rol.entidad.nombre2 = datos['nombre2']
    rol.entidad.personalidad = datos['personalidad']
    rol.entidad.rfc = datos['rfc']

    if rol.contactos:
        rol.contactos[0].valor = datos['telefono']
    else:
        contacto = {
            'rol_id': rol.id,
            'tipo': u'Tel fijo',
            'valor': datos['telefono']}
        contacto = Contacto(**contacto)
        man.session().add(contacto)
        if rol.contactos:
            rol.contactos.append(contacto)
        else:
            rol.contactos = [contacto]

    funcionesOld = [x for x in rol.atributos if x.nombre==u'función']


    for item in datos['funciones']:
        if item[0]:
            funcion = [x for x in funcionesOld if x.id == item[0]][0]
            funcion.valor = item[1]
        else:
            funcion = AtributoRol(rol_id=rol.id, nombre=u'función', valor=item[1])
            rol.atributos.append(funcion)
            man.session().add(funcion)

    # if rol.funciones:
        # if funciones:
            # for funcion in rol.funciones:
                # print 2345, funcion
                # if funcion in

    if datos['lugar'][1] == -1 and datos['lugar'][0]:
        lugar = Atributo(grupo=u'lugar', nombre=datos['lugar'][0])
        man.session().add(lugar)
        man.session().flush()
        datos['lugar'][1] = lugar.id

    if rol.direcciones:
        rol.direcciones[0].lugar_id = datos['lugar'][1]
        rol.direcciones[0].areapostal = datos['areapostal']
        rol.direcciones[0].areanominal = datos['areanominal']
        rol.direcciones[0].calle = datos['calle']
    else:
        if datos['lugar'] and datos['areapostal'] and datos['areanominal'] and datos['calle']:
            direccion = Direccion(lugar_id=datos['lugar'][1], areapostal = datos['areapostal'], areanominal = datos['areanominal'], calle = datos['calle'])
            man.session().add(direccion)
            rol.direcciones = [direccion]

    rol.dato2 = datos['dato2']

    man.session().update(rol)
    man.session().commit()
    return rol.id



def inicializa():
    try:
        version = int(atributoI(grupo=u'entidad', nombre=u'versionBasedatos').valor)
    except:
        print "Inicializando Base de datos para entidades"
        registros = [
            {'code':1405, 'grupo':u'personalidadEntidad', 'nombre':u'Física', 'referencia':u'1'},
            {'code':1407, 'grupo':u'personalidadEntidad', 'nombre':u'Moral', 'referencia':u'0'},

            {'code':1421, 'grupo':u'tipoRol', 'nombre':u'propio'},
            {'code':1423, 'grupo':u'tipoRol', 'nombre':u'empleado'},
            {'code':1425, 'grupo':u'tipoRol', 'nombre':u'banco'},
            {'code':1427, 'grupo':u'tipoRol', 'nombre':u'proveedor'},
            {'code':1429, 'grupo':u'tipoRol', 'nombre':u'cliente'},

            {'code':1431, 'grupo':u'tipoEmpleado', 'nombre':u'técnico'},
            {'code':1433, 'grupo':u'tipoEmpleado', 'nombre':u'vendedor'},
            {'code':1435, 'grupo':u'tipoEmpleado', 'nombre':u'administrador'},

            {'code':1451, 'grupo':u'tipoContacto', 'nombre':u'tel fijo'},
            {'code':1453, 'grupo':u'tipoContacto', 'nombre':u'tel móvil'},
            {'code':1455, 'grupo':u'tipoContacto', 'nombre':u'email'}
            ]
        # id=1441, grupo=u'cliente', nombre=u'default', valor=

        for registro in registros:
            atributoI(**registro)

        ## Instituciones Bancarias
        lista = [
        [3, u'Banamex', u'Banco Nacional de México, S.A.', u'', u'BAN111111222', u'Isabel la Católica 44', u'Col. Centro Histórico, Del. Cuauhtémoc', u'México, D.F.', u'06000'],
        [7, u'Banco Santander', u'Banco Santander, S.A.', u'', u'SAN111111333', u'Prol. Paseo de la Reforma No. 500, Piso 4; Mód.401', u'Col. Lomas de Santa Fe', u'México, D.F.', u'01219'],
        [11, u'BBVA Bancomer', u'BBVA Bancomer, S.A.', u'', u'BBV111111222', u'Av. Universidad No. 1200, 2º Piso', u'Col. Xoco', u'México, D.F.', u'03339'],
        [15, u'HSBC', u'HSBC México, S.A.', u'', u'HSB111111222', u'Paseo de la Reforma No. 347', u'Col. Juárez', u'México, D.F.', u'06600'],
        [19, u'ScotiaBank', u'Scotiabank, S.A.', u'', u'SCO111111222', u'Blvd. Manuel Ávila Camacho No. 1 Piso 19', u'Col. Lomas de Chapultepec', u'México, D.F.', u'11009'],
        ]

        for item in lista:
            datos = {}
            datos['code'] = item[0]
            datos['tipo'] = u'banco'

            datos['personalidad'] = int(personalidad(nombre=u'Moral').referencia)
            datos['nombre'] = item[2]
            datos['nombre2'] = item[3]
            datos['rfc'] = item[4]
            datos['fechanacimiento'] = datetime.date(1900,1,1)

            datos['lugar'] = item[7]
            datos['areapostal'] = item[8]
            datos['areanominal'] = item[6]
            datos['calle'] = item[5]

            datos['alias'] = item[1]

            rol = rolI(**datos)

        ## CLIENTES
        datos = {}
        datos['code'] = 3
        datos['tipo'] = u'cliente'

        datos['personalidad'] = int(personalidad(nombre=u'Física').referencia)
        datos['nombre'] = u'Público'
        datos['nombre2'] = u'general'
        datos['rfc'] = u'XXXX010101XXX'
        datos['fechanacimiento'] = datetime.date(1900,1,1)

        datos['lugar'] = u'Los Mochis, Sin.'
        datos['areapostal'] = u'81200'
        datos['areanominal'] = u'Col. Centro'
        datos['calle'] = u'Domicilio conocido'

        datos['telefonoFijo'] = u''

        rol = rolI(**datos)

        atributoI(code=1441, grupo=u'cliente', nombre=u'default', valor=u"%s" % rol.id)


        atributoI(grupo=u'entidad', nombre=u'versionBasedatos', valor=u'1')
        version = 1


# print (0), "  personas.modelo       end"



